import Vue from 'vue';
import axios from 'axios';
import qs from 'qs';
import router from '@/router';
import { apiBaseUrl } from '@/utils/config';
// 实现外部链接请求 ，即存在http或者是https 就是请求外部接口
let api = axios.create({
  baseURL: '/',
  timeout: 80000,
  // 设置cross跨域
  crossDomain: true,
  // 设置cross跨域 并设置访问权限 允许跨域携带cookie信息
  withCredentials: true,
});
api.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 判断链接是否带有http或者https
    let reg = /(http|https):\/\/([\w.]+\/?)\S*/gi;
    if (!config.url.match(reg)) {
      config.url = apiBaseUrl + config.url;
    }
    // get请求
    if (config.method.toLowerCase() === 'get') {
      config.params = {
        ...config.params,
      };
    }
    !config.headers['Content-Type']
      ? (config.headers['Content-Type'] = 'application/x-www-form-urlencoded')
      : void 666;
    // post请求
    if (
      config.method.toLowerCase() === 'post' &&
      config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
    ) {
      if (config.data) {
        config.data = {
          ...config.data,
        };
      } else {
        config.data = {
          ...config.data,
        };
      }

      config.data = qs.stringify(config.data);
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 响应拦截器
api.interceptors.response.use(
  (response) => {
    return Promise.resolve(response);
  },
  (error) => {
    if (error.response) {
      switch (error.response.status) {
        case 303:
          return Promise.reject(error);
          break;
        case 400:
          // 错误的请求
          break;
        case 401:
          // 未授权 — 未授权客户机访问数据, 理解客户未登录
          router.push({ path: '/login' });
          break;
        case 403:
          break;
        case 404:
          // 页面不存在
          break;
        case 500:
          //  服务器内部错误
          break;
        case 502:
          //  响应超时，请检查网络
          break;
        default:
        // 其他错误
      }
    }
    if (error.message.search('Network Error') > -1) {
      console.log('网络走丢了,请检查网络后刷新');
    }
    if (error.message.search('timeout') > -1) {
      // 仅在网络出现故障的情况下才会弹该窗口,如果经常出现要注意是否有太多请求阻塞了
      // Vue.prototype.$toast.msg('网络不给力,请检查网络');
    }
    return Promise.reject(error);
  }
);

let http = {};
// get请求，数据获取
http.get = (url, params) => {
  return new Promise((resolve, reject) => {
    api
      .get(
        url,
        {
          params: params,
        },
        {
          cancelToken: new axios.CancelToken(function executor(cancel) {
            // executor 函数接收一个 cancel 函数作为参数
            http.abort = cancel;
          }),
        }
      )
      .then((res) => {
        resolve(res);
      })
      .catch((err) => {
        reject(err);
      });
  });
};

// post请求，新建数据
http.post = (url, params) => {
  return new Promise((resolve, reject) => {
    api
      .post(url, params, {
        cancelToken: new axios.CancelToken(function executor(cancel) {
          // executor 函数接收一个 cancel 函数作为参数
          http.abort = cancel;
        }),
      })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      });
  });
};
// 处理并发请求的助手函数
http.all = api.all;
http.spread = api.spread;

export default http;
